import 'package:flutter_structure/modules/user/controllers/user_controller.dart';
import 'package:flutter_structure/utils/logger.dart';
import 'package:get/get.dart';

class NavigationController {
  static NavigationController get to => Get.find();

  final UserController _userController = Get.find<UserController>();

  /// 普通跳转方法
  void push(String routeName, {Map<String, dynamic>? parameters}) {
    // 直接传递参数（如果有的话）
    Get.toNamed(routeName, arguments: parameters);
  }

  /// 需要鉴权的跳转方法
  Future<void> pushWithAuth(String routeName, {Map<String, dynamic>? parameters}) async {
    if (_userController.isLoggedIn) {
      Get.toNamed(routeName, arguments: parameters);
    } else {
      await Get.toNamed('/login');
      if (_userController.isLoggedIn) {
        Get.back();
        Get.toNamed(routeName, arguments: parameters);
      } else {
        Logger.error('登录失败，无法跳转到目标页面', tag: 'NavigationController');
      }
    }
  }



  /// 替换当前页面
  void replace(String routeName, {Map<String, String>? parameters}) {
    Get.offNamed(routeName, arguments: parameters);
  }

  /// 需要鉴权的页面替换
  Future<void> replaceWithAuth(String routeName, {Map<String, String>? parameters}) async {
    if (_userController.isLoggedIn) {
      Get.offNamed(routeName, arguments: parameters);
    } else {
      await Get.toNamed('/login');
      if (_userController.isLoggedIn) {
        Get.back();
        Get.offNamed(routeName, arguments: parameters);
      } else {
        Logger.error('登录失败，无法替换到目标页面', tag: 'NavigationController');
      }
    }
  }

  /// 清空路由栈并跳转到目标页面
  void clearAndPush(String routeName, {Map<String, String>? parameters}) {
    Get.offAllNamed(routeName, arguments: parameters);
  }

  /// 清空路由栈并跳转到需要鉴权的目标页面
  Future<void> clearAndPushWithAuth(String routeName, {Map<String, String>? parameters}) async {
    if (_userController.isLoggedIn) {
      Get.offAllNamed(routeName, arguments: parameters);
    } else {
      await Get.toNamed('/login');
      if (_userController.isLoggedIn) {
        Get.back();
        Get.offAllNamed(routeName, arguments: parameters);
      } else {
        Logger.error('登录失败，无法跳转到目标页面', tag: 'NavigationController');
      }
    }
  }

  /// 返回上一页面，并可以附带一个结果（返回码或数据）
  void back<T>({T? result}) {
    if (canPop()) {
      Get.back(result: result); // 返回结果
    } else {
      Logger.warn('无法返回，因为没有可返回的页面', tag: 'NavigationController');
    }
  }

  /// 返回到指定页面
  void backTo(String routeName) {
    if (Get.currentRoute == routeName) {
      Logger.info('当前已经是目标页面', tag: 'NavigationController');
    } else {
      Get.until((route) => route.settings.name == routeName);
    }
  }

  /// 检查是否可以返回
  bool canPop() {
    return Get.key.currentState?.canPop() ?? false;
  }
}
